/*
 * CrudGerentePresenter
 * 
 * Versão 1.0
 * 
 * Data de criação: 27/05/2013
 * 
 * Copyright (c)
 * Autor: Odair José Tanes
 * Matrícula: 2009209186
 * Disciplina: Projeto de Sistemas de Software
 * 
 * Protótipo criado para exercício da disciplina
 * 
 * 
 * 
 *______________________________________________________________________________
 * Correções a serem feitas:
 * 
 *  1 - O Cliente obrigatório passado em addListenerBtnSalvar ainda está null
 *  2 - Atualizar tabela de listagem de agências usando Observer
 * 
 * 
 * 
 */
package edu.ufes.pss.exercicioSwingBanco.presenter;

import edu.ufes.pss.exercicioSwingBanco.interfaces.DaoInterface;
import edu.ufes.pss.exercicioSwingBanco.factory.DaoGerenteFactory;
import edu.ufes.pss.exercicioSwingBanco.model.Gerente;
import edu.ufes.pss.exercicioSwingBanco.view.CrudGerenteView;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 *
 * @author OdairJT
 */
public class CrudGerentePresenter {

    private CrudGerenteView view;

    public CrudGerentePresenter() {
        this.view = new CrudGerenteView();

        addListenerBtnSalvar();
        addListenerBtnEditar();
        addListenerBtnExcluir();
        addListenerBtnFechar();

        this.view.setLocationRelativeTo(null);
        this.view.getTxtNome().grabFocus();
        this.view.setVisible(true);
    }

    public CrudGerentePresenter(String pCPF) {
        this.view = new CrudGerenteView();

        addListenerBtnSalvar();
        addListenerBtnEditar();
        addListenerBtnExcluir();
        addListenerBtnFechar();

        DaoInterface p = DaoGerenteFactory.CriarDaoGerente(1);
        Gerente g = (Gerente) p.buscarObjeto(pCPF);

        this.view.getTxtNome().setText(g.getNome());
        this.view.getTxtEndereco().setText(g.getEndereco());
        this.view.getTxtEmail().setText(g.getEmail());
        this.view.getTxtCPF().setText(g.getCpf());
        this.view.getTxtDataNascimento().setText(g.getDataAniversario());
        this.view.getTxtLogin().setText(g.getLogin());

        this.view.getTxtNome().setEnabled(false);
        this.view.getTxtEndereco().setEnabled(false);
        this.view.getTxtCPF().setEnabled(false);
        this.view.getTxtDataNascimento().setEnabled(false);
        this.view.getTxtEmail().setEnabled(false);
        this.view.getTxtLogin().setEnabled(false);
        this.view.getBtnSalvar().setEnabled(false);
        this.view.getBtnEditar().setEnabled(true);
        this.view.getBtnExcluir().setEnabled(true);
        
        this.view.setLocationRelativeTo(null);
        this.view.getTxtNome().grabFocus();
        this.view.setVisible(true);
    }

    private void addListenerBtnSalvar() {
        this.view.getBtnSalvar().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnSalvar();
            }
        });
    }

    private void actionPerformedBtnSalvar() {
        if (validaDados()) {

            /* O padrão factory retorna a instância de acordo com a forma 
             * de persistencia selecionada
             */

            DaoInterface p = DaoGerenteFactory.CriarDaoGerente(1);

            Gerente gerente;

            gerente = new Gerente(
                    this.view.getTxtCPF().getText(),
                    this.view.getTxtNome().getText(),
                    this.view.getTxtDataNascimento().getText(),
                    this.view.getTxtEmail().getText(),
                    this.view.getTxtEndereco().getText(),
                    this.view.getTxtLogin().getText());

            if (p.salvarOuAtualizar(gerente)) {
                /* Atualziar listagem via Observer */
                ListaGerentePresenter listaGerentePresenter = new ListaGerentePresenter();
                this.view.dispose();
            }

        } else {
            this.view.showMessage("Dados inválidos!");
        }
    }

    private boolean validaDados() {

        boolean retorno = true;

        if (this.view.getTxtNome().getText().isEmpty()
                || this.view.getTxtEndereco().getText().isEmpty()
                || this.view.getTxtEmail().getText().isEmpty()
                || this.view.getTxtCPF().getText().isEmpty()
                || this.view.getTxtDataNascimento().getText().isEmpty()
                || this.view.getTxtLogin().getText().isEmpty()) {

            retorno = false;

        }

        return retorno;

    }

    private void addListenerBtnEditar() {
        this.view.getBtnEditar().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnEditar();
            }
        });
    }

    private void actionPerformedBtnEditar() {
        this.view.getTxtNome().setEnabled(true);
        this.view.getTxtEndereco().setEnabled(true);
        this.view.getTxtEmail().setEnabled(true);
        this.view.getTxtDataNascimento().setEnabled(true);
        this.view.getTxtLogin().setEnabled(true);
        this.view.getBtnSalvar().setEnabled(true);
        this.view.getBtnEditar().setEnabled(false);
        this.view.getBtnExcluir().setEnabled(false);
        
    }

    private void addListenerBtnExcluir() {
        this.view.getBtnExcluir().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnExcluir();
            }
        });
    }

    private void actionPerformedBtnExcluir() {
        /* O padrão factory retorna a instância de acordo com a forma 
         * de persistencia selecionada
         */

        DaoInterface daoGerente = DaoGerenteFactory.CriarDaoGerente(1);

        String cpf = this.view.getTxtCPF().getText();

        Gerente tempGerente = (Gerente) daoGerente.buscarObjeto(cpf);

        if (this.view.showConfirmMessage("Verificação de ação", "Excluir?") == 0) {
            if (daoGerente.excluir(tempGerente)) {
                ListaGerentePresenter listaGerentePresenter = new ListaGerentePresenter();
                this.view.dispose();
            }
        }
    }

    private void addListenerBtnFechar() {
        this.view.getBtnFechar().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnFechar();
            }
        });
    }

    private void actionPerformedBtnFechar() {
        ListaGerentePresenter listaGerentePresenter = new ListaGerentePresenter();
        this.view.dispose();
    }
}
